package com.common.components;

import com.common.pojo.entity.BaseDO;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Collection;

/**
 * @Brief 实体类父类服务
 * @Author chenyl
 * @Date 2023-08-07
 * @Version 1.0.0
 */
@Component
public class BaseEntityComponent {

    /**
     * 获取当前用户编码
     *
     * @return 用户编码
     */
    private String getUserCode() {
        /*
         * TODO 根据当前项目的业务架构，获取当前登录用户的id
         */
        return "";
    }

    /**
     * 设置对象的创建信息
     *
     * @param t   业务对象
     * @param <T> 实体泛型
     */
    public <T extends BaseDO> void setCreateInfo(T t) {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 获取当前用户编码
        String userCode = this.getUserCode();
        // 设置删除标识
        t.setIsDelete(Boolean.FALSE);
        // 设置操作信息
        t.setCreateTime(now);
        t.setCreateUserCode(userCode);
        t.setUpdateTime(now);
        t.setUpdateUserCode(userCode);
    }

    /**
     * 设置对象的修改信息
     *
     * @param t   业务对象
     * @param <T> 实体泛型
     */
    public <T extends BaseDO> void setUpdateInfo(T t) {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 获取当前用户编码
        String userCode = this.getUserCode();
        // 设置操作信息
        t.setUpdateTime(now);
        t.setUpdateUserCode(userCode);
    }

    /**
     * 批量设置对象的创建信息
     *
     * @param ts  业务对象列表
     * @param <T> 实体泛型
     */
    public <T extends BaseDO> void setBatchCreateInfo(Collection<T> ts) {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 获取当前用户编码
        String userCode = this.getUserCode();
        // 遍历列表设置创建信息
        for (T t : ts) {
            // 设置删除标识
            t.setIsDelete(Boolean.FALSE);
            // 设置操作信息
            t.setCreateTime(now);
            t.setCreateUserCode(userCode);
            t.setUpdateTime(now);
            t.setUpdateUserCode(userCode);
        }
    }

    /**
     * 批量设置对象的修改信息
     *
     * @param ts  业务对象列表
     * @param <T> 实体泛型
     */
    public <T extends BaseDO> void setBatchUpdateInfo(Collection<T> ts) {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 获取当前用户编码
        String userCode = this.getUserCode();
        // 遍历列表设置修改信息
        for (T t : ts) {
            // 设置操作信息
            t.setUpdateTime(now);
            t.setUpdateUserCode(userCode);
        }
    }
}
